package action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringEscapeUtils;

import common.DelegaServicos;
import common.Suporte;

import entity.Cidade;
import entity.Endereco;
import entity.Foto;
import entity.Imovel;
import entity.Pessoa;
import entity.StatusImovel;
import entity.TipoImovel;

@SuppressWarnings("serial")
public class CadastrarImovel extends Suporte{

	private Pessoa usuario;
	private List<TipoImovel> tiposImovel;
	private String tipoId;
	private String descricaoImovel;
	private String descricaoPagamento;
	private boolean garagem;
	private List<Cidade> listaCidades;
	private String cidadeId;
	private Cidade cidade;
	private String logradouro;
	private String cep;
	private String bairro;
	private String complemento;
	private String numero;
	private File arquivo;   
    private String arquivoFileName; //nome do arquivo
    private String arquivoContentType; //tipo do arquivo (imagem, txt)    
	private String descricaoImagem;
	private static final String REGEX_FILE_STRING = "^.+[.][jJ][pP][gG]?$";

	public String execute() throws Exception {
		
		DelegaServicos delegador = new DelegaServicos();
		
		this.listaCidades = new ArrayList<Cidade>();
		this.tiposImovel = new ArrayList<TipoImovel>();

		this.listaCidades = delegador.getCidadeController().listaCidades();
		
		this.tiposImovel = TipoImovel.getTipoImovel();
		
		if(isPostMethod()) {
			
			Pessoa pessoaTemp = new Pessoa();
			pessoaTemp = retornaUsuarioDaSessao();
			
			this.usuario = delegador.getPessoaController().retornaPessoa(pessoaTemp.getLoginPessoa());
			
			Imovel novoImovel = new Imovel();
			Endereco endereco = new Endereco();
			Foto foto = new Foto();
			
			if(this.tipoId.equalsIgnoreCase("")){
				addActionError(getText("tipoImovel.required"));
				return INPUT;
			}
			
			if(this.descricaoImovel.trim().length() == 0){
				addActionError(getText("descricaoImovel.required"));
				return INPUT;
			}
			
			if(this.descricaoPagamento.trim().length() == 0) {
				addActionError(getText("descricaoPagamento.required"));
				return INPUT;
			}
						
			if(this.cidadeId.trim().length() == 0){
				addActionError(getText("cidade.required"));
				return INPUT;
			}
			
			if(this.logradouro.trim().length() == 0){
				addActionError(getText("logradouro.required"));
				return INPUT;
			}
			
			if(this.bairro.trim().length() == 0){
				addActionError(getText("bairro.required"));
				return INPUT;
			}
			
			if(this.complemento.trim().length() == 0){
				addActionError(getText("complemento.required"));
				return INPUT;
			}
			
			if(this.numero.trim().length() == 0){
				addActionError(getText("numero.required"));
				return INPUT;
			}
			
			if(!Pattern.matches(REGEX_FILE_STRING, this.arquivoFileName)) {
				addActionError(getText("extensao.invalid"));
				return INPUT;
			}

			this.cidade = delegador.getCidadeController().retornaCidade(Integer.parseInt(this.cidadeId));
			
			novoImovel.setPessoa(this.usuario);
			
			for (TipoImovel tipo : this.tiposImovel) {
				
				if(tipo.getId() == Integer.parseInt(this.tipoId)) {
					
					novoImovel.setTipo(tipo);
					
				}
				
			}
			
			novoImovel.setDescricaoImovel(this.descricaoImovel);
			novoImovel.setDescricaoPagamento(this.descricaoPagamento);
			novoImovel.setGaragem(this.garagem);
			
			endereco.setCidade(this.cidade);
			endereco.setLogradouro(this.logradouro);
			endereco.setCep(this.cep);
			endereco.setBairro(this.bairro);
			endereco.setComplemento(this.complemento);
			endereco.setNumero(Integer.parseInt(this.numero));
			
			delegador.getEnderecoController().cadastra(endereco);
			
			novoImovel.setEndereco(endereco);
			
			copiaArquivo(this.arquivo, new File("/ImagensProjeto/" + this.arquivoFileName));
			foto.setDescricaoFoto(this.descricaoImagem);
			foto.setUrl("/ImagensProjeto/" + this.arquivoFileName);
			
			delegador.getFotoController().cadastra(foto);
			
			novoImovel.setFoto(foto);
			novoImovel.setStatus(StatusImovel.CADASTRADO);
			
			delegador.getImovelController().cadastra(novoImovel);
			addActionMessage(getText("imovel.success"));
			return SUCCESS;
			
		} else {
			
			return INPUT;
			
		}
		
	}

	private static void copiaArquivo(File in, File out) {
		
		try {
		
            FileChannel sourceChannel = new FileInputStream(in).getChannel();   
            FileChannel destinationChannel = new FileOutputStream(out).getChannel();   
            sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);   
            sourceChannel.close();   
            destinationChannel.close(); 
			
		} catch(IOException ex) {
			
			ex.printStackTrace();
		}
		
		
	}

	public Pessoa getUsuario() {
		return usuario;
	}


	public void setUsuario(Pessoa usuario) {
		this.usuario = usuario;
	}


	public List<TipoImovel> getTiposImovel() {
		return tiposImovel;
	}


	public void setTiposImovel(List<TipoImovel> tiposImovel) {
		this.tiposImovel = tiposImovel;
	}


	public String getTipoId() {
		return tipoId;
	}


	public void setTipoId(String tipoId) {
		this.tipoId = tipoId;
	}


	public String getDescricaoImovel() {
		return descricaoImovel;
	}


	public void setDescricaoImovel(String descricaoImovel) {
		this.descricaoImovel = descricaoImovel;
	}


	public String getDescricaoPagamento() {
		return descricaoPagamento;
	}


	public void setDescricaoPagamento(String descricaoPagamento) {
		this.descricaoPagamento = descricaoPagamento;
	}


	public boolean isGaragem() {
		return garagem;
	}


	public void setGaragem(boolean garagem) {
		this.garagem = garagem;
	}


	public List<Cidade> getListaCidades() {
		return listaCidades;
	}


	public void setListaCidades(List<Cidade> listaCidades) {
		this.listaCidades = listaCidades;
	}


	public String getCidadeId() {
		return cidadeId;
	}


	public void setCidadeId(String cidadeId) {
		this.cidadeId = cidadeId;
	}


	public Cidade getCidade() {
		return cidade;
	}


	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}


	public String getLogradouro() {
		return logradouro;
	}


	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}


	public String getCep() {
		return cep;
	}


	public void setCep(String cep) {
		this.cep = cep;
	}


	public String getBairro() {
		return bairro;
	}


	public void setBairro(String bairro) {
		this.bairro = bairro;
	}


	public String getComplemento() {
		return complemento;
	}


	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}


	public String getNumero() {
		return numero;
	}


	public void setNumero(String numero) {
		this.numero = numero;
	}
	
	public File getArquivo() {
		return arquivo;
	}


	public void setArquivo(File arquivo) {
		this.arquivo = arquivo;
	}


	public String getArquivoFileName() {
		return arquivoFileName;
	}


	public void setArquivoFileName(String arquivoFileName) {
		this.arquivoFileName = arquivoFileName;
	}


	public String getArquivoContentType() {
		return arquivoContentType;
	}


	public void setArquivoContentType(String arquivoContentType) {
		this.arquivoContentType = arquivoContentType;
	}


	public String getDescricaoImagem() {
		return descricaoImagem;
	}


	public void setDescricaoImagem(String descricaoImagem) {
		this.descricaoImagem = descricaoImagem;
	}

}
